package com.sudo.boot.admin._sys;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.mybatisflex.core.paginate.Page;
import com.sudo.boot.base.pojo.JsonRes;
import com.sudo.boot.mapper.sys.model.bo.*;
import com.sudo.boot.mapper.sys.model.vo.*;
import com.sudo.boot.service.sys.SysRoleService;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;

/**
 * 系统角色  控制层。
 *
 * @author admins
 * @since 2023-10-13
 */
@RestController
@RequestMapping("/sys-role")
public class SysRoleController {

    @Resource
    private SysRoleService sysRoleService;

    /**
     * 新增角色 。
     *
     * @param bo 角色信息
     */
    @SaCheckPermission("role_add")
    @PostMapping("add")
    public JsonRes<Void> add(@RequestBody @Validated SysRoleBoAdd bo) {
        sysRoleService.add(bo);
        return JsonRes.ok();
    }

    /**
     * 新增角色 。
     *
     * @param bo 角色信息
     */
    @SaCheckPermission("role_edit")
    @PostMapping("edit")
    public JsonRes<Void> edit(@RequestBody @Validated SysRoleBoEdit bo) {
        sysRoleService.edit(bo);
        return JsonRes.ok();
    }

    /**
     * 分页获取角色信息
     * @param bo 查询条件
     */
    @GetMapping("page")
    public JsonRes<Page<SysRolePageVo>> page(@Validated SysRoleBoPageQuery bo) {
        Page<SysRolePageVo> page = sysRoleService.page(bo);
        return JsonRes.ok(page);
    }

    /**
     * 根据主键删除系统角色 。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @SaCheckPermission("role_remove")
    @DeleteMapping("remove/{id}")
    public JsonRes<Void> remove(@PathVariable Serializable id) {
        sysRoleService.deleteById(id);
        return JsonRes.ok();
    }

    /**
     * 根据系统角色 主键获取详细信息。
     *
     * @param id 系统角色 主键
     * @return 系统角色 详情
     */
    @GetMapping("detail/{id}")
    public JsonRes<SysRoleVo> detail(@PathVariable Serializable id) {
        SysRoleVo sysRoleVo = sysRoleService.detail(id);
        return JsonRes.ok(sysRoleVo);
    }

    /**
     * 查询角色列表
     */
    @GetMapping("listSimple")
    public JsonRes<List<SysRoleSimpleVo>> listSimple() {
        List<SysRoleSimpleVo> simpleVoList = sysRoleService.listSimple();
        return JsonRes.ok(simpleVoList);
    }

    /**
     * 角色状态切换 。
     *
     * @param bo 角色信息
     */
    @SaCheckPermission("role_status")
    @PostMapping("status")
    public JsonRes<Void> status(@RequestBody @Validated SysRoleBoStatus bo) {
        sysRoleService.status(bo);
        return JsonRes.ok();
    }

    /**
     * 角色授权
     */
    @SaCheckPermission("role_permission")
    @PostMapping("permission")
    public JsonRes<Void> permission(@RequestBody @Validated SysRoleBoMenu bo) {
        sysRoleService.permission(bo);
        return JsonRes.ok();
    }

    /**
     * 用户解绑角色
     */
    @SaCheckPermission("role_unbindUser")
    @PostMapping("unbindUser")
    public JsonRes<Void> unbindUser(@RequestBody @Validated SysRoleBoUnbindUser bo) {
        sysRoleService.unbindUser(bo);
        return JsonRes.ok();
    }
}
